#include "MYDecode.h"
#include "MYDecodeThread.h"


MYDecodeThread::MYDecodeThread()
{
    // 打开解码器
    if(!decode) decode = new MYDecode();
}

MYDecodeThread::~MYDecodeThread()
{
	// 等待线程退出
	isExit = true;
	wait();
}

void MYDecodeThread::Push(AVPacket *pkt)
{
    if(!pkt) return;
    // 进行阻塞，防止队列爆掉
    while(!isExit) {
        mux.lock();
        if(pack_list.size() < maxList)
        {
            pack_list.push_back(pkt);
            mux.unlock();
            break;
        }
        mux.unlock();
        msleep(1);  // 睡眠1ms，等待队列任务数减少
    }
}

// 清理队列
void MYDecodeThread::Clear()
{
    mux.lock();
    decode->Clear();
    while(!pack_list.empty()) {
        AVPacket *pkt = pack_list.front();
        MYFreePacket(&pkt);
        pack_list.pop_front();
    }
    mux.unlock();
}

void MYDecodeThread::Close()
{
    Clear();
    // 等待线程结束
    isExit = true;
    wait();
    // 关闭解码器
    decode->Close();

    mux.lock();
    delete decode;
    decode = NULL;
    mux.unlock();
}

//取出一帧数据，并出栈，如果没有返回NULL
AVPacket *MYDecodeThread::Pop()
{
    mux.lock();
    if(pack_list.empty()) {
        mux.unlock();
        return NULL;
    }
    AVPacket *pkt = pack_list.front();
    pack_list.pop_front();
    mux.unlock();
    return pkt;
}
